package com.jie.component.mongo.base;

import com.jie.component.mongo.wrapper.LambdaMongoQueryWrapper;
import com.jie.component.mongo.wrapper.LambdaMongoUpdateWrapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

public interface MongoRepository<T extends MongoDocument> {
    // 插入操作
    T save(T entity);
    List<T> saveBatch(Collection<T> entityList);

    // 删除操作
    void deleteById(String id);
    void deleteByIds(Collection<String> ids);
    void delete(LambdaMongoQueryWrapper<T> queryWrapper);
    
    // 查询操作
    Optional<T> findById(String id);
    List<T> findByIds(Collection<String> ids);
    List<T> findAll();
    
    // 条件查询
    List<T> findByCondition(LambdaMongoQueryWrapper<T> wrapper);
    Page<T> findPageByCondition(LambdaMongoQueryWrapper<T> wrapper, Pageable pageable);
    Optional<T> findOne(LambdaMongoQueryWrapper<T> wrapper);
    long count(LambdaMongoQueryWrapper<T> wrapper);
    boolean exists(LambdaMongoQueryWrapper<T> wrapper);
    
    // 更新操作
    void update(LambdaMongoUpdateWrapper<T> updateWrapper);
    void updateById(String id, LambdaMongoUpdateWrapper<T> updateWrapper);
    void upsert(LambdaMongoUpdateWrapper<T> updateWrapper);
    void updateBatch(Collection<String> ids, LambdaMongoUpdateWrapper<T> updateWrapper);
    
    // 聚合操作
    <R> List<R> aggregate(List<AggregationOperation> operations, Class<R> resultClass);
    <R> Optional<R> aggregateOne(List<AggregationOperation> operations, Class<R> resultClass);
    long aggregateCount(List<AggregationOperation> operations);
    
    // 批量操作
    void bulkUpsert(List<LambdaMongoUpdateWrapper<T>> updateWrappers);
}